package QianFeng08.CollectionDemo;

import java.util.HashMap;
import java.util.Map;

/**
 * Map接口1.8新增方法介绍
 * 在JDK8中Map接口提供了一些新的便利的方法。因为在本文中我所提到的所有Map方法都是以默认值方法的方式实现的，
 * 所以现有的Map接口的实现可以直接拥有这些在默认值方法中定义的默认行为，而不需要新增一行代码。
 * getOrDefault(Object, V)    返回指定的键映射的值
 * putIfAbsent(K,V)
 * remove(Object key, Object value)
 * replace(K,V)
 * replace(K,V,V)
 * compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
 * computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
 * merge(K key, V value, BiFunction< ? super V,? super V,? extends V> remappingFunction)
 **/
public class MapNewMethodDemo {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "大神");
        map.put(2, "大佬");
        map.put(3, "高手");

        String  value = map.getOrDefault(4, "null");
        System.out.println(value);

        //添加相同Key值时，对应value值会被覆盖   put
        System.out.println("--------------------------------put----------------------------");
        String val = map.put(3, "vince");//覆盖原来的值
        System.out.println(val);//高手  返回old值
        map.forEach((k, v) -> System.out.println(k + "->" + v));

        //putIfAbsent  只会添加不存在的Key的值，Key相同值不会被覆盖
        System.out.println("-----------------------------putIfAbsent--------------------------");
        String val1 = map.putIfAbsent(2, "sun");
        String val2 = map.putIfAbsent(4, "sun");
        System.out.println(val1);
        System.out.println(val2);
        map.forEach((k, v) -> System.out.println(k + "->" + v));

        //remove  要删除Key和Value都要对应匹配，没对应则不会删除
        System.out.println("-----------------------------remove--------------------------");
        map.remove(1, "sun");//1对应的是大神，没对应成功，不会删除
        map.forEach((k, v) -> System.out.println(k + "->" + v));

        //replace  Value值替换
        System.out.println("----------------------------replace-------------------------");
        map.replace(3, "菜鸟");
        map.replace(3, "高手", "菜鸡");//Key与oldValue匹配才能替换
        map.forEach((k, v) -> System.out.println(k + "->" + v));

        //compute  可以对值进行操作改变
        System.out.println("----------------------------compute-------------------------");
        map.compute(1, (k, V) -> V + "耶");
        //computeIfAbsent  添加
        map.computeIfAbsent(5, (va) -> va + "弱鸡");//添加为空的Key，存在的Key则添加不了
        map.forEach((k, v) -> System.out.println(k + "->" + v));

        //merge  合并
        System.out.println("----------------------------merge-------------------------");
        map.merge(1, "!!!", String::concat);//在oldVal基础上添加 !!!
        //map.merge(1, "大神", (oldVal, newVal) -> oldVal.concat(newVal));
        map.forEach((k, v) -> System.out.println(k + "->" + v));

    }
}

